package cc.parkhome.appapi.infrastructure.util;

import cc.parkhome.appapi.application.service.dto.feign.CityDTO;
import cc.parkhome.appapi.domian.enums.EstateConditionConstant;
import cc.parkhome.appapi.domian.enums.RentSellType;
import cc.parkhome.appapi.ports.rest.vm.EstateConditionVM;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Base64;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 通用的工具类
 * 不允许传null,没有非空判断
 *
 * @author 赵建新
 * @date 2017/11/8 15:59
 */
public class CommonUtil {


    /**
     * 判断对象内指定的字段是否为null,字符串是否为空串
     * 赵建新 2017年11月8日 16:37:04
     *
     * @param object
     * @param fields
     * @return
     */
    public static boolean baseCheckObjField(Object object, String... fields) {
        Set<String> collect = Arrays.stream(fields).collect(Collectors.toSet());
        try {
            for (Field field : object.getClass().getDeclaredFields()) {
                if (collect.contains(field.getName())) {
                    field.setAccessible(true);
                    if (!check(field.get(object))) {
                        return false;
                    }
                }
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 判断对象内未被排除字段是否为null,字符串是否为空串
     * 赵建新 2017年11月8日 16:37:04
     *
     * @param object
     * @param ignoreFields
     * @return
     */
    public static boolean baseCheckObjFieldIgnore(Object object, String... ignoreFields) {
        Set<String> collect = Arrays.stream(ignoreFields).collect(Collectors.toSet());
        try {
            for (Field field : object.getClass().getDeclaredFields()) {
                if (collect.contains(field.getName())) {
                    continue;
                }
                field.setAccessible(true);
                if (!check(field.get(object))) {
                    return false;
                }
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 判断对象内指定类的字段字段是否为null,字符串是否为空串
     * 赵建新 2017年11月8日 16:37:04
     *
     * @param object
     * @param ignoreFields
     * @return
     */
    public static boolean baseCheckObjFieldByClass(Object object, Class classObj, String... ignoreFields) {
        if (classObj == null) {
            return false;
        }
        Set<String> collect = Arrays.stream(ignoreFields).collect(Collectors.toSet());
        Set<String> collectClass = Arrays.stream(classObj.getDeclaredFields()).map(field -> {
            field.setAccessible(true);
            return field.getName();
        }).collect(Collectors.toSet());
        try {
            for (Field field : object.getClass().getDeclaredFields()) {
                if (collect.contains(field.getName())) {
                    continue;
                }
                if (collect.contains(field.getName())) {
                    field.setAccessible(true);
                    if (!check(field.get(object))) {
                        return false;
                    }
                }
            }
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 判断指定的字段是否为null,字符串是否为空串
     * 赵建新 2017年11月8日 16:37:04
     *
     * @param fields
     * @return
     */
    public static boolean baseCheckField(Object... fields) {
        for (Object field : fields) {
            if (!check(field)) {
                return false;
            }
        }
        return true;
    }


    private static boolean check(Object object) {

        if (object == null) {
            return false;

        }
        if (object instanceof String) {
            if (!StringUtils.hasText((String) (object))) {
                return false;
            }
        }
        return true;

    }


    /**
     * 测试正常 赵建新 2017年11月8日 16:36:16
     *
     * @param s
     */

    public static void main(String[] s) {
        CityDTO cityDTO = new CityDTO();
        cityDTO.setProvinceName("     ");
        boolean provinceName = baseCheckObjField(cityDTO);
        System.currentTimeMillis();
    }

    /**
     * 把每个MultipartFile 转成base64字符串 判空处理
     * 赵建新 2017年11月15日 17:57:02
     *
     * @param roomImg
     * @return
     */
    public static String[] MultipartFileTOBase64String(MultipartFile[] roomImg) {
        String[] strings = null;
        if (roomImg != null && roomImg.length > 0) {
            strings = Arrays.stream(roomImg).map(multipartFile -> {
                try {
                    return Base64.getEncoder().encodeToString(multipartFile.getBytes());
                } catch (IOException e) {
                    throw new IllegalStateException("MultipartFile to Base64 String Error");
                }
            }).collect(Collectors.toList()).toArray(new String[]{});
        }
        return strings;
    }

    /**
     * 把每个InputStream 转成base64字符串 判空处理
     * 赵建新 2017年11月15日 17:57:02
     *
     * @param inputStream
     * @return
     */
    public static String InputStreamTOBase64String(InputStream inputStream) {
        try {
            byte[] bytes = StreamUtils.copyToByteArray(inputStream);
            return Base64.getEncoder().encodeToString(bytes);
        } catch (Exception e) {
            throw new IllegalStateException("InputStream to Base64 String Error");
        }
    }
}
